import unittest
import requests

from api.login_api import RegLoginApi
from api.open_account_api import OpenAccountApi
from api.recharge_api import RechargeApi
from api.tender_api import TenderApi

from common.utils import init_tender_info, common_assert, html_util, read_json, clear_user_info
from parameterized import parameterized


class TestTender(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        # 借款标测试数据初始化
        init_tender_info()

    def setUp(self) -> None:
        # 创建session对象
        self.session = requests.session()
        # 调用投资模块类
        self.tender_api = TenderApi(self.session)
        # 调用登录模块类
        self.login_api = RegLoginApi(self.session)
        # 调用开户模块类
        self.open_api = OpenAccountApi(self.session)
        # 调用充值模块类
        self.recharge_api = RechargeApi(self.session)

    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 投资测试用例
    @parameterized.expand(read_json("/tender_data", "tender"))
    def test01_tender(self, phone, password, id, amount, exp_status_code, exp_status, description):
        # 用户登录
        body = {"keywords": phone, "password": password}
        self.login_api.user_login(body)
        # 投资
        resp = self.tender_api.tender(id, amount)
        # 断言
        common_assert(self, resp, exp_status_code, exp_status, description)

    # 第三方投资测试用例
    def test02_third_tender(self):
        # 用户登陆
        body = {"keywords": "13389898980", "password": "123456"}
        self.login_api.user_login(body)
        # 投资
        resp_3 = self.tender_api.tender(642, 1000)
        # 获取第三方接口投资接口的url 和请求数据
        url = html_util(resp_3)[0]
        form_dict = html_util(resp_3)[1]
        # 实现第三方投资接口
        resp = self.tender_api.third_tender(url, form_dict)
        # 断言
        self.assertIn("OK", resp.text)

    # 投资业务流程
    def test03_tender_process(self):
        # 用户信息初始化
        clear_user_info()
        # 将使用的数据，设置为变量，方便进行统一管理
        r = 123
        phone = "18812345678"
        pwd = "123456"
        type = "reg"
        imgVerifyCode = "8888"
        phoneVerifyCode = "666666"
        exp_status_code = 200
        exp_status = 200
        des_success = '成功'
        realname = "张三"
        card_id = "110101199006075010"
        des_form = 'form'

        # 1.图片验证码接口
        # 通过调用封装的图片验证码接口的方法，获取响应结果
        resp_1 = self.login_api.get_img_verify_code(r)
        # 断言状态码
        self.assertEqual(200, resp_1.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        body_1 = {"phone": phone, "imgVerifyCode": imgVerifyCode, "type": type}
        resp_2 = self.login_api.get_phone_verify_code(body_1)
        # 断言-通用断言
        common_assert(self, resp_2, exp_status_code, exp_status, des_success)

        # 3.注册接口
        # 通过调用封装的注册接口的方法，获取响应结果
        body_2 = {"phone": phone, "password": pwd, "verifycode": imgVerifyCode, "phone_code": phoneVerifyCode,
                  "dy_server": "on", "invite_phone": None}
        resp_3 = self.login_api.user_register(body_2)
        # 断言-通用断言
        common_assert(self, resp_3, exp_status_code, exp_status, des_success)

        # 4.登录接口
        # 通过调用封装的登录接口的方法，获取响应结果
        body_3 = {"keywords": phone, "password": pwd}
        resp_4 = self.login_api.user_login(body_3)
        # 断言-通用断言
        common_assert(self, resp_4, exp_status_code, exp_status, des_success)

        # 5.实名认证接口
        # 通过调用封装的实名认证接口的方法，获取响应结果
        resp_5 = self.open_api.realname(realname, card_id)
        # 断言-通用断言
        common_assert(self, resp_5, exp_status_code, exp_status, des_success)
        # 实名认证信息断言
        self.assertEqual("张**", resp_5.json().get('data').get('realname'))

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        resp_6 = self.open_api.open_account()
        # 断言-通用断言
        common_assert(self, resp_6, exp_status_code, exp_status, des_form)

        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(resp_6)[0]
        form_dict = html_util(resp_6)[1]
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        resp_7 = self.open_api.third_open_account(url, form_dict)

        # 断言状态码
        self.assertEqual(exp_status_code, resp_7.status_code)
        # 断言响应体数据
        self.assertIn("OK", resp_7.text)

        # 8.获取充值验证码接口
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        # 断言状态码

        # 9.充值接口
        # 通过调用封装的充值接口的方法，获取响应结果
        # 断言-通用断言

        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        # 断言状态码
        # 断言响应体数据

        # 11.投资接口
        # 通过调用封装的投资接口的方法，获取响应结果
        # 断言-通用断言

        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        # 断言状态码
        # 断言响应体数据
